با Module Federation جاوا اسکریپت برای ساخت سیستمهای پلاگین پویا آشنا شوید. معماری، پیادهسازی، امنیت و بهترین شیوهها برای برنامههای مقیاسپذیر و قابل نگهداری را بیاموزید.
معماری پلاگین با Module Federation جاوا اسکریپت: ساخت یک سیستم پلاگین پویا
در چشمانداز پیچیده توسعه وب امروزی، ساخت برنامههای ماژولار، مقیاسپذیر و قابل نگهداری امری حیاتی است. یکی از تکنیکهای قدرتمند برای دستیابی به این هدف، استفاده از معماری پلاگین است که در آن عملکرد به ماژولهای مستقل و بارگذاری شده به صورت پویا تقسیم میشود. Module Federation جاوا اسکریپت، یکی از ویژگیهای وبپک ۵، مکانیزم قدرتمندی برای پیادهسازی چنین معماریهایی فراهم میکند. این مقاله به بررسی جزئیات استفاده از Module Federation برای ساخت یک سیستم پلاگین پویا میپردازد.
Module Federation چیست؟
Module Federation به برنامههای جاوا اسکریپت اجازه میدهد تا کد را به صورت پویا در زمان اجرا به اشتراک بگذارند. این بدان معناست که یک ماژول (بخشی از کد) از یک برنامه میتواند مستقیماً توسط برنامه دیگری استفاده شود، بدون اینکه نیازی به بیلد مجدد یا استقرار مجدد داشته باشد. این امر با expose کردن و consume کردن ماژولها در بین بیلدهای مختلف و حتی استقرارهای متفاوت محقق میشود.
روشهای سنتی اشتراکگذاری کد، مانند پکیجهای npm، نیازمند بیلد و استقرار مجدد برنامههای مصرفکننده در هر بار بهروزرسانی یک وابستگی مشترک هستند. Module Federation این سربار را حذف میکند و آن را برای سناریوهایی که نیازمند بهروزرسانیهای مکرر و استقرارهای مستقل هستند، ایدهآل میسازد.
چرا از Module Federation برای معماری پلاگین استفاده کنیم؟
Module Federation مزایای متعددی هنگام ساخت معماری پلاگین ارائه میدهد:
- بارگذاری ماژول پویا: پلاگینها میتوانند در زمان اجرا بارگذاری و تخلیه شوند، که به برنامهها اجازه میدهد با نیازهای در حال تغییر سازگار شوند بدون اینکه به استقرار مجدد کامل نیاز داشته باشند.
- جداسازی (Decoupling): پلاگینها به طور مستقل توسعه و مستقر میشوند، که وابستگیها بین بخشهای مختلف برنامه را کاهش میدهد.
- مقیاسپذیری: برنامه را میتوان به راحتی با پلاگینهای جدید گسترش داد بدون اینکه بر عملکرد موجود تأثیر بگذارد.
- قابلیت نگهداری: پلاگینها میتوانند به طور مستقل بهروزرسانی و نگهداری شوند، که خطر وارد کردن باگ به برنامه اصلی را کاهش میدهد.
- استفاده مجدد از کد: پلاگینها میتوانند در چندین برنامه مورد استفاده مجدد قرار گیرند، که باعث ترویج یکپارچگی و کاهش تلاش برای توسعه میشود.
- نسخهبندی و بازگشت (Rollbacks): شما میتوانید نسخههای مختلف پلاگینها را مدیریت کرده و در صورت لزوم به راحتی به نسخههای قبلی بازگردید.
مفاهیم اصلی: کانتینرهای میزبان (Host) و ریموت (Remote)
Module Federation حول دو مفهوم کلیدی میچرخد:
- کانتینر میزبان (Host): برنامه اصلی که ماژولهای ریموت (پلاگینها) را مصرف میکند.
- کانتینر ریموت (Remote): برنامهای که ماژولها (پلاگینها) را برای مصرف توسط میزبان expose میکند.
کانتینر میزبان به صورت پویا فایل remote entry را از کانتینر ریموت دریافت میکند، که حاوی یک مانیفست از ماژولهای expose شده است. سپس میزبان میتواند به این ماژولها دسترسی پیدا کرده و از آنها استفاده کند، گویی که بخشی از کد خود میزبان هستند.
پیادهسازی یک سیستم پلاگین پویا با Module Federation: راهنمای گام به گام
بیایید فرآیند ساخت یک سیستم پلاگین ساده با استفاده از Module Federation را مرور کنیم. ما یک برنامه میزبان و یک برنامه پلاگین ریموت ایجاد خواهیم کرد.
۱. راهاندازی برنامه میزبان (Host Container)
ابتدا، یک دایرکتوری پروژه جدید ایجاد کرده و یک پروژه npm جدید را مقداردهی اولیه کنید:
mkdir host-app
cd host-app
npm init -y
وبپک و وابستگیهای آن را نصب کنید:
npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev
یک فایل `webpack.config.js` در دایرکتوری `host-app` با پیکربندی زیر ایجاد کنید:
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
const path = require('path');
module.exports = {
mode: 'development',
devtool: 'source-map',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
devServer: {
port: 3000,
hot: true,
static: {
directory: path.join(__dirname, 'dist'),
},
},
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react'],
},
},
},
],
},
plugins: [
new ModuleFederationPlugin({
name: 'Host',
remotes: {
'plugin': 'Plugin@http://localhost:3001/remoteEntry.js',
},
shared: ['react', 'react-dom'],
}),
new HtmlWebpackPlugin({
template: './public/index.html',
}),
],
};
توضیح:
- `name`: نام برنامه میزبان.
- `remotes`: کانتینرهای ریموتی را که میزبان مصرف خواهد کرد، تعریف میکند. در این مورد، یک کانتینر ریموت به نام `plugin` از `http://localhost:3001/remoteEntry.js` مصرف میشود. سینتکس `Plugin@` به این معنی است که `name` در ModuleFederationPlugin ریموت، 'Plugin' است.
- `shared`: لیستی از وابستگیهایی است که بین میزبان و کانتینرهای ریموت به اشتراک گذاشته شدهاند. این کار از بارگذاری نسخههای تکراری این وابستگیها جلوگیری میکند. استفاده از `shared` برای جلوگیری از خطاها و اطمینان از عملکرد صحیح پلاگین بسیار مهم است.
یک دایرکتوری `src` ایجاد کنید و یک فایل `index.js` با محتوای زیر به آن اضافه کنید:
import React, { Suspense } from 'react';
import ReactDOM from 'react-dom/client';
const PluginComponent = React.lazy(() => import('plugin/PluginComponent'));
const App = () => {
return (
<div>
<h1>Host Application</h1>
<Suspense fallback={<div>Loading Plugin...</div>}>
<PluginComponent />
</Suspense>
</div>
);
};
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
توضیح:
- ما از `React.lazy` برای وارد کردن پویای `PluginComponent` از ریموت `plugin` استفاده میکنیم. این برای بارگذاری تنبل (lazy loading) پلاگین و جلوگیری از تأخیر در بارگذاری اولیه بسیار مهم است.
- کامپوننت `Suspense` برای مدیریت وضعیت بارگذاری در حالی که پلاگین در حال دریافت است، استفاده میشود.
یک دایرکتوری `public` ایجاد کنید و یک فایل `index.html` با محتوای زیر به آن اضافه کنید:
<!DOCTYPE html>
<html>
<head>
<title>Host Application</title>
</head>
<body>
<div id="root"></div>
<script src="./bundle.js"></script>
</body>
</html>
یک فایل پیکربندی Babel به نام `.babelrc` اضافه کنید:
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
فایل `package.json` خود را با یک اسکریپت start بهروز کنید:
{
"name": "host-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "webpack serve --mode development",
"build": "webpack --mode production"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.23.9",
"@babel/preset-env": "^7.23.9",
"@babel/preset-react": "^7.23.3",
"babel-loader": "^9.1.3",
"html-webpack-plugin": "^5.6.0",
"webpack": "^5.90.3",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
}
۲. راهاندازی برنامه ریموت (کانتینر پلاگین)
یک دایرکتوری پروژه جدید برای پلاگین ایجاد کنید:
mkdir plugin-app
cd plugin-app
npm init -y
وبپک و وابستگیهای آن را نصب کنید:
npm install webpack webpack-cli webpack-dev-server html-webpack-plugin --save-dev
یک فایل `webpack.config.js` در دایرکتوری `plugin-app` با پیکربندی زیر ایجاد کنید:
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
const path = require('path');
module.exports = {
mode: 'development',
devtool: 'source-map',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
devServer: {
port: 3001,
hot: true,
static: {
directory: path.join(__dirname, 'dist'),
},
},
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react'],
},
},
},
],
},
plugins: [
new ModuleFederationPlugin({
name: 'Plugin',
filename: 'remoteEntry.js',
exposes: {
'./PluginComponent': './src/PluginComponent',
},
shared: ['react', 'react-dom'],
}),
new HtmlWebpackPlugin({
template: './public/index.html',
}),
],
};
توضیح:
- `name`: نام کانتینر ریموت (پلاگین). این نام **باید** با نام استفاده شده در پیکربندی `remotes` میزبان مطابقت داشته باشد.
- `filename`: نام فایل remote entry که میزبان آن را دریافت خواهد کرد.
- `exposes`: ماژولهایی را که توسط کانتینر ریموت expose شدهاند، تعریف میکند. در این مورد، ما ماژول `PluginComponent` را expose میکنیم. کلید './PluginComponent' در دستور import میزبان استفاده میشود (مثلاً `import('plugin/PluginComponent')`).
- `shared`: همانند میزبان، وابستگیهای به اشتراک گذاشته شده را لیست میکند. حیاتی است که وابستگیهای به اشتراک گذاشته شده و نسخههای آنها بین میزبان و ریموت سازگار باشند.
یک دایرکتوری `src` ایجاد کنید و یک فایل `PluginComponent.jsx` با محتوای زیر به آن اضافه کنید:
import React from 'react';
const PluginComponent = () => {
return (
<div style={{border: '1px solid blue', padding: '10px'}}>
<h2>Plugin Component</h2>
<p>This is a dynamically loaded plugin!</p>
</div>
);
};
export default PluginComponent;
یک فایل `index.js` در دایرکتوری `src` برای export کردن PluginComponent ایجاد کنید:
import PluginComponent from './PluginComponent';
export default PluginComponent;
یک دایرکتوری `public` ایجاد کنید و یک فایل `index.html` با محتوای زیر به آن اضافه کنید:
<!DOCTYPE html>
<html>
<head>
<title>Plugin Application</title>
</head>
<body>
<div id="root"></div>
<script src="./bundle.js"></script>
</body>
</html>
یک فایل پیکربندی Babel به نام `.babelrc` اضافه کنید:
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
فایل `package.json` خود را با یک اسکریپت start بهروز کنید:
{
"name": "plugin-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "webpack serve --mode development",
"build": "webpack --mode production"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.23.9",
"@babel/preset-env": "^7.23.9",
"@babel/preset-react": "^7.23.3",
"babel-loader": "^9.1.3",
"html-webpack-plugin": "^5.6.0",
"webpack": "^5.90.3",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
}
۳. اجرای برنامهها
هر دو برنامه میزبان و پلاگین را با اجرای `npm start` در دایرکتوریهای مربوطه خود اجرا کنید.
در مرورگر خود به `http://localhost:3000` بروید. شما باید برنامه میزبان را با کامپوننت پلاگین که به صورت پویا بارگذاری شده است، مشاهده کنید.
ویژگیهای پیشرفته و ملاحظات
نسخهبندی و بازگشت (Rollbacks)
Module Federation از نسخهبندی پشتیبانی میکند و به شما امکان میدهد نسخههای مختلف پلاگینها را مدیریت کنید. شما میتوانید محدودیتهای نسخه را در پیکربندی `remotes` میزبان مشخص کنید. برای مثال:
remotes: {
'plugin': 'Plugin@http://localhost:3001/remoteEntry.js@1.0.0',
}
این به میزبان میگوید که از نسخه 1.0.0 پلاگین استفاده کند. اگر نسخه جدیدتری موجود باشد، میزبان تا زمانی که به صراحت بهروزرسانی نشود، به استفاده از نسخه مشخص شده ادامه خواهد داد. پیادهسازی نسخهبندی قوی برای جلوگیری از تغییرات شکننده (breaking changes) و اطمینان از پایداری برنامه بسیار مهم است.
ملاحظات امنیتی
هنگام استفاده از Module Federation، امنیت از اهمیت بالایی برخوردار است. موارد زیر را در نظر بگیرید:
- احراز هویت و مجوزدهی: مکانیزمهای مناسب احراز هویت و مجوزدهی را برای اطمینان از اینکه فقط کاربران مجاز میتوانند به پلاگینها دسترسی داشته باشند و از آنها استفاده کنند، پیادهسازی کنید.
- یکپارچگی کد: یکپارچگی ماژولهای ریموت را برای جلوگیری از تزریق کد مخرب به برنامه تأیید کنید. استفاده از سیاست امنیتی محتوا (CSP) را برای محدود کردن منابعی که برنامه میتواند از آنها منابع بارگذاری کند، در نظر بگیرید.
- مدیریت وابستگیها: وابستگیهای هر دو کانتینر میزبان و ریموت را به دقت مدیریت کنید تا از آسیبپذیریها جلوگیری شود. به طور منظم وابستگیها را به آخرین نسخهها بهروز کنید.
- اعتبارسنجی ورودی: تمام دادههای دریافتی از ماژولهای ریموت را برای جلوگیری از حملات تزریق (injection attacks) اعتبارسنجی کنید.
- CORS (Cross-Origin Resource Sharing): CORS را به درستی پیکربندی کنید تا به برنامه میزبان اجازه دسترسی به فایل remote entry از برنامه پلاگین را بدهد.
کشف و مدیریت پلاگین
برای سیستمهای پلاگین پیچیدهتر، ممکن است به مکانیزمی برای کشف و مدیریت پلاگینها نیاز داشته باشید. این کار میتواند از طریق یک رجیستری پلاگین یا یک سرویس کشف انجام شود. یک رجیستری مرکزی میتواند اطلاعات مربوط به پلاگینهای موجود، از جمله مکان، نسخه و وابستگیهای آنها را ذخیره کند. سپس برنامه میزبان میتواند از رجیستری برای یافتن و بارگذاری پلاگینهای مناسب پرسوجو کند.
این رویکردها را در نظر بگیرید:
- پیکربندی متمرکز: URLهای پلاگین را در یک فایل پیکربندی مرکزی (مثلاً یک فایل JSON) ذخیره کنید که برنامه میزبان در زمان اجرا آن را میخواند. این به شما امکان میدهد به راحتی پلاگینها را اضافه، حذف یا بهروز کنید بدون اینکه برنامه میزبان را مجدداً مستقر کنید.
- کشف مبتنی بر API: یک نقطه پایانی API ایجاد کنید که لیستی از پلاگینهای موجود را برمیگرداند. سپس برنامه میزبان میتواند این لیست را دریافت کرده و پلاگینها را به صورت پویا بارگذاری کند.
- معماری رویداد محور: از یک event bus یا صف پیام برای اطلاعرسانی به برنامه میزبان در هنگام در دسترس بودن پلاگینهای جدید استفاده کنید. این امکان کشف و بارگذاری ناهمزمان پلاگین را فراهم میکند.
پیکربندی پویا و فعالسازی پلاگین
اجازه دادن به کاربران برای پیکربندی و فعالسازی پویا پلاگینها یک ویژگی قدرتمند است. این نیازمند مکانیزمی برای ذخیره و مدیریت پیکربندیهای پلاگین است. شما میتوانید از یک پایگاه داده، یک فایل پیکربندی یا یک سرویس پیکربندی مبتنی بر ابر برای ذخیره تنظیمات پلاگین استفاده کنید. سپس برنامه میزبان میتواند این تنظیمات را در زمان اجرا بخواند و پلاگینها را بر اساس آن فعال کند. ارائه یک رابط کاربری برای مدیریت پیکربندیهای پلاگین را در نظر بگیرید.
مدیریت عملیات ناهمزمان و مدیریت خطا
هنگام کار با پلاگینهای بارگذاری شده به صورت پویا، مدیریت عملیات ناهمزمان و خطاها به شیوهای مناسب ضروری است. از `async/await` یا Promises برای مدیریت کد ناهمزمان استفاده کنید. مدیریت خطای مناسب را برای گرفتن و ثبت هرگونه خطایی که در حین بارگذاری یا اجرای پلاگین رخ میدهد، پیادهسازی کنید. پیامهای خطای آموزنده به کاربر ارائه دهید. استفاده از یک سرویس ثبت خطای متمرکز برای ردیابی خطاها در تمام پلاگینها را در نظر بگیرید.
تقسیم کد (Code Splitting) و بهینهسازی عملکرد
برای بهینهسازی عملکرد، از تقسیم کد برای شکستن برنامه و پلاگینها به تکههای کوچکتر استفاده کنید. این به مرورگر اجازه میدهد فقط کدی را که برای یک صفحه یا ویژگی خاص مورد نیاز است، دانلود کند. وبپک پشتیبانی داخلی برای تقسیم کد فراهم میکند. استفاده از بارگذاری تنبل (lazy loading) را برای بارگذاری پلاگینها فقط در صورت نیاز در نظر بگیرید. کد را برای کاهش اندازه فایل، کوچکسازی (minify) و فشردهسازی کنید.
تست و یکپارچهسازی مداوم (CI)
سیستم پلاگین خود را به طور کامل آزمایش کنید تا از عملکرد صحیح آن اطمینان حاصل کنید. تستهای واحد، تستهای یکپارچهسازی و تستهای end-to-end بنویسید. از یک سیستم یکپارچهسازی مداوم (CI) برای اجرای خودکار تستها در هر بار تغییر کد استفاده کنید. یک خط لوله تحویل مداوم (CD) را برای خودکارسازی استقرار برنامه و پلاگینها پیادهسازی کنید.
مثالها و موارد استفاده در دنیای واقعی
Module Federation در انواع برنامههای دنیای واقعی استفاده میشود، از جمله:
- پلتفرمهای تجارت الکترونیک: بارگذاری پویا توصیههای محصول، درگاههای پرداخت و ارائهدهندگان حمل و نقل. به عنوان مثال، یک پلتفرم تجارت الکترونیک جهانی میتواند از Module Federation برای ادغام ارائهدهندگان پرداخت مختلف بر اساس مکان مشتری استفاده کند. در آمریکای شمالی، ممکن است یک پلاگین برای Stripe بارگذاری کند، در حالی که در اروپا، ممکن است یک پلاگین برای PayPal یا Klarna بارگذاری کند.
- سیستمهای مدیریت محتوا (CMS): اجازه دادن به کاربران برای نصب و فعالسازی پلاگینها برای گسترش عملکرد CMS. یک CMS میتواند به کاربران اجازه دهد پلاگینهایی برای بهینهسازی سئو، ادغام با رسانههای اجتماعی یا تحلیل محتوا نصب کنند.
- داشبوردها و پلتفرمهای تحلیلی: بارگذاری پویا ویجتها و تجسمهای مختلف. یک پلتفرم تحلیلی جهانی ممکن است پلاگینهایی برای منابع داده مختلف مانند Google Analytics، Adobe Analytics یا Salesforce بارگذاری کند.
- معماریهای میکروسرویس فرانتاند: ساخت برنامههای وب در مقیاس بزرگ به عنوان مجموعهای از میکروسرویسهای فرانتاند که به طور مستقل قابل استقرار هستند. یک شرکت بزرگ میتواند از Module Federation برای ساخت برنامه وب خود به عنوان مجموعهای از میکروسرویسهای فرانتاند استفاده کند که هر کدام مسئول یک عملکرد تجاری خاص مانند مدیریت حساب، کاتالوگ محصول یا پردازش سفارش هستند.
- سیستمهای طراحی (Design Systems): به اشتراکگذاری کامپوننتهای UI و توکنهای طراحی در چندین برنامه. یک سازمان جهانی با چندین برند میتواند از Module Federation برای به اشتراکگذاری یک سیستم طراحی مشترک در تمام برنامههای خود استفاده کند و از یکپارچگی و کاهش تلاش برای توسعه اطمینان حاصل کند.
بهترین شیوهها برای ساخت سیستمهای پلاگین پویا با Module Federation
در اینجا چند بهترین شیوه برای در نظر گرفتن هنگام ساخت سیستمهای پلاگین پویا با Module Federation آورده شده است:
- پلاگینها را کوچک و متمرکز نگه دارید: هر پلاگین باید مسئول یک بخش خاص از عملکرد باشد. این کار نگهداری و بهروزرسانی پلاگینها را آسانتر میکند.
- رابطهای پلاگین واضح تعریف کنید: رابطهای واضحی برای نحوه تعامل پلاگینها با برنامه میزبان تعریف کنید. این کار تضمین میکند که پلاگینها با میزبان سازگار هستند و از تغییرات شکننده جلوگیری میکند.
- از نسخهبندی معنایی (Semantic Versioning) استفاده کنید: از نسخهبندی معنایی برای مدیریت نسخههای پلاگینهای خود استفاده کنید. این کار ردیابی تغییرات و اطمینان از سازگاری را آسانتر میکند.
- مستندات ارائه دهید: مستندات واضح و مختصر برای پلاگینهای خود ارائه دهید. این به کاربران کمک میکند تا نحوه نصب، پیکربندی و استفاده از پلاگینها را بفهمند.
- بهترین شیوههای امنیتی را پیادهسازی کنید: از بهترین شیوههای امنیتی برای محافظت از برنامه و پلاگینهای خود در برابر آسیبپذیریها پیروی کنید.
- عملکرد پلاگین را نظارت کنید: عملکرد پلاگینهای خود را برای شناسایی هرگونه گلوگاه نظارت کنید. کد را برای بهبود عملکرد بهینهسازی کنید.
- استقرار را خودکار کنید: استقرار برنامه و پلاگینهای خود را خودکار کنید. این کار خطر خطاها را کاهش میدهد و تضمین میکند که بهروزرسانیها به سرعت مستقر میشوند.
- از یک سبک کدنویسی ثابت استفاده کنید: یک سبک کدنویسی ثابت را در تمام پلاگینها اعمال کنید. این کار خواندن و نگهداری کد را آسانتر میکند.
- تستهای واحد بنویسید: برای پلاگینهای خود تستهای واحد بنویسید تا از عملکرد صحیح آنها اطمینان حاصل کنید.
- از یک Linter استفاده کنید: از یک linter برای بررسی خودکار کد خود برای خطاها استفاده کنید.
نتیجهگیری
Module Federation جاوا اسکریپت یک مکانیزم قدرتمند و انعطافپذیر برای ساخت سیستمهای پلاگین پویا فراهم میکند. با بهرهگیری از Module Federation، میتوانید برنامههای ماژولار، مقیاسپذیر و قابل نگهداری ایجاد کنید که میتوانند با نیازهای در حال تغییر سازگار شوند. با پیروی از بهترین شیوههای ذکر شده در این مقاله، میتوانید سیستمهای پلاگین قوی و امنی بسازید که نیازهای سازمان شما را برآورده کند.
این فناوری به ویژه در زمینههای بینالمللی ارزشمند است و به کسبوکارها امکان میدهد تا پیشنهادات نرمافزاری خود را برای مناطق یا بخشهای خاص مشتریان سفارشیسازی کنند بدون اینکه نیاز به استقرار برنامههای کاملاً جداگانه داشته باشند. از ادغام درگاههای پرداخت محلی گرفته تا ارائه محتوای مخصوص منطقه، Module Federation یک تجربه کاربری شخصیتر و کارآمدتر را در سطح جهانی تسهیل میکند.